// 使用Node.js内置功能生成自签名证书
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import forge from 'node-forge';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 创建证书目录
const certDir = path.join(__dirname, '.cert');
if (!fs.existsSync(certDir)) {
  fs.mkdirSync(certDir);
}

console.log('正在生成自签名SSL证书...');

try {
  // 生成RSA密钥对
  console.log('生成RSA密钥对...');
  const keys = forge.pki.rsa.generateKeyPair(2048);
  
  // 创建证书
  console.log('创建证书...');
  const cert = forge.pki.createCertificate();
  cert.publicKey = keys.publicKey;
  
  // 设置证书有效期（从当前时间开始，有效期一年）
  cert.validity.notBefore = new Date();
  cert.validity.notAfter = new Date();
  cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
  
  // 设置证书主题和颁发者属性
  const attrs = [
    { name: 'commonName', value: 'localhost' },
    { name: 'countryName', value: 'CN' },
    { name: 'organizationName', value: 'AIVoice Dev' },
    { name: 'organizationalUnitName', value: 'Development' }
  ];
  cert.setSubject(attrs);
  cert.setIssuer(attrs); // 自签名，所以颁发者和主题相同
  
  // 添加基本约束扩展
  cert.setExtensions([
    {
      name: 'basicConstraints',
      cA: true
    },
    {
      name: 'keyUsage',
      keyCertSign: true,
      digitalSignature: true,
      nonRepudiation: true,
      keyEncipherment: true,
      dataEncipherment: true
    },
    {
      name: 'subjectAltName',
      altNames: [
        { type: 2, value: 'localhost' },
        { type: 7, ip: '127.0.0.1' },
        { type: 7, ip: '192.168.99.124' }
      ]
    }
  ]);
  
  // 使用私钥签署证书
  cert.sign(keys.privateKey, forge.md.sha256.create());
  
  // 将私钥转换为PEM格式
  const privateKeyPem = forge.pki.privateKeyToPem(keys.privateKey);
  
  // 将证书转换为PEM格式
  const certPem = forge.pki.certificateToPem(cert);
  
  // 将PEM格式的私钥和证书写入文件
  fs.writeFileSync(path.join(certDir, 'key.pem'), privateKeyPem);
  fs.writeFileSync(path.join(certDir, 'cert.pem'), certPem);
  
  console.log('SSL证书生成成功！');
  console.log(`证书文件位置: ${certDir}`);
  console.log('注意：这是自签名证书，浏览器会显示警告，需要手动添加例外。');
} catch (error) {
  console.error('生成SSL证书时出错:', error.message);
  console.log('详细错误:', error);
} 